#!/bin/bash

# 导入配置
source config.sh

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m' # 恢复默认颜色

# 隧道配置数组 (添加端口信息)
TUNNELS=(
  "${NATAPP_CONTAINER_NAME1}|${NATAPP_AUTH_TOKEN1}|${NATAPP_PORT1}"
)
  #"${NATAPP_CONTAINER_NAME2}|${NATAPP_AUTH_TOKEN2}|${NATAPP_PORT2}"

# 检查 Docker 是否安装
check_docker() {
    if ! command -v docker &>/dev/null; then
        echo -e "${RED}错误: Docker 未安装，请先安装 Docker${NC}"
        exit 1
    fi
}

# 检查本地 _natapp 文件是否存在
check_local_binary() {
    if [[ ! -f "./_natapp" ]]; then
        echo -e "${RED}错误: 本地 _natapp 文件不存在，请确保文件位于当前目录下${NC}"
        exit 1
    fi

    # 检查文件是否可执行，若不可执行则添加权限
    if [[ ! -x "./_natapp" ]]; then
        echo -e "${YELLOW}提示: 添加执行权限到 _natapp 文件${NC}"
        chmod +x ./_natapp
    fi
}

# 检查容器状态
# 返回值: 0=运行中, 1=已停止, 2=未创建
check_container() {
    local container_name=$1

    if docker ps -a --format '{{.Names}}' | grep -q "^${container_name}\$"; then
        if docker ps --format '{{.Names}}' | grep -q "^${container_name}\$"; then
            echo -e "${GREEN}容器 ${container_name} 正在运行${NC}"
            return 0
        else
            echo -e "${YELLOW}容器 ${container_name} 存在但已停止${NC}"
            return 1
        fi
    else
        echo -e "${YELLOW}容器 ${container_name} 未安装${NC}"
        return 2
    fi
}

# 构建通用 Natapp 镜像（不含Token）
build_image() {
    echo -e "${YELLOW}正在使用本地 _natapp 文件构建通用镜像...${NC}"

    # 创建临时构建上下文
    TEMP_DIR=$(mktemp -d)
    trap 'rm -rf ${TEMP_DIR}' EXIT

    # 复制本地 _natapp 文件到临时目录
    cp ./_natapp "${TEMP_DIR}/"

    # 生成通用 Dockerfile (不含Token)
    cat > "${TEMP_DIR}/Dockerfile" <<EOF
FROM alpine:3.14
WORKDIR ${NATAPP_WORK_DIR}
COPY _natapp .
ENTRYPOINT ["./_natapp"]
EOF

    # 强制重建镜像（忽略缓存）
    if ! docker build --no-cache -t ${NATAPP_IMAGE_NAME} "${TEMP_DIR}"; then
        echo -e "${RED}镜像构建失败！${NC}"
        exit 1
    fi
    echo -e "${GREEN}通用镜像重建完成${NC}"
}

# 运行容器 (添加本地端口参数)
run_container() {
    local container_name=$1
    local auth_token=$2
    local local_port=$3

    echo -e "${YELLOW}启动容器 ${container_name} ...${NC}"
    echo -e "${GREEN}使用 Token: ${auth_token}, 映射到: 127.0.0.1:${local_port}${NC}"

    # 强制删除旧容器（如果存在）
    if docker inspect ${container_name} &>/dev/null; then
        docker rm -f ${container_name} >/dev/null
    fi

    # 运行容器并传入对应Token和本地端口
    docker run -d \
        --name ${container_name} \
        --restart unless-stopped \
        --network host \
        ${NATAPP_IMAGE_NAME} \
        -authtoken=${auth_token} \
        -log=stdout \
        -l=127.0.0.1:${local_port}  # 关键修改：添加本地端口参数
}

# 主执行逻辑
check_docker
check_local_binary
build_image

# 处理所有隧道
for tunnel in "${TUNNELS[@]}"; do
    IFS='|' read -r container_name auth_token local_port <<< "${tunnel}"

    echo -e "\n${YELLOW}====== 处理隧道: ${container_name} ======${NC}"
    echo -e "${YELLOW}配置隧道Token: ${auth_token}${NC}"
    echo -e "${YELLOW}配置隧道到本地端口: ${local_port}${NC}"
    check_container "$container_name"
    status=$?

    case $status in
        0) # 容器正在运行
            echo -e "${YELLOW}重启容器以应用新配置...${NC}"
            docker restart "$container_name"
            ;;
        1) # 容器已停止
            echo -e "${YELLOW}启动容器...${NC}"
            docker start "$container_name"
            ;;
        2) # 容器未创建
            run_container "$container_name" "$auth_token" "$local_port"
            ;;
    esac

    # 验证容器状态
    sleep 1 # 等待容器状态更新
    echo -e "${GREEN}容器状态:${NC}"
    docker ps -f name="$container_name" --format "table {{.Names}}\t{{.Status}}"
done

# 显示所有隧道状态
echo -e "\n${GREEN}====== 最终状态 ======${NC}"
docker ps -f name="${NATAPP_CONTAINER_NAME1}\|${NATAPP_CONTAINER_NAME2}" \
    --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

echo -e "\n${YELLOW}查看日志命令:${NC}"
echo "隧道1: docker logs -f ${NATAPP_CONTAINER_NAME1}"
echo "隧道2: docker logs -f ${NATAPP_CONTAINER_NAME2}"